package com.codemonkey.lq.qd.facotry.config;


import java.util.Collection;

import com.codemonkey.lq.qd.ServiceContext;


/**
 * 我觉得仿造MyBatis的org.apache.ibatis.plugin.PluginChain命名为ActionChain也不错呢.
 * TODO 到底是应该是继承自ServiceDefinitionMetaData,还是包含一个ServiceDefinitionMetaData.
 * @author LQ
 *
 */
public interface ServiceDefinition extends FlowGraph,ServiceDefinitionMetaData {

	/**
	 * @return 本Service在整个容器内的唯一性的Identity
	 */
	String getId();
	
	SConfiguration getConfiguration();
	
	/**
	 * 此命名遵循Bob大叔在《Clean Code》中的建议之: 不要在给集合的命名中加上容器类型名;应该使用xxGroup或者bunchOfxx;
	 * 
	 * 不保证顺序
	 *  
	 * @return 本Service内包含的所有Action
	 */
	Collection<ActionDefinition> getActionGroup();

	boolean addAction(ActionDefinition action);

	boolean removeAction(ActionDefinition action);
	
	ActionDefinition getSpecialAction(String actionName);
	
	void execute(ServiceContext serviceContext) throws Exception;
}
